В [1]:
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-9bff4a0a6096> in <module>
      1 import os
----> 2 c.TemplateExporter.template_path = ['.', os.path.expanduser('~/.jupyter/templates/')]

NameError: name 'c' is not defined

В [1]:

Шаг 1. Загрузить данные

В [2]:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4000 entries, 0 to 3999
Data columns (total 14 columns):
 #   Column                             Non-Null Count  Dtype  
---  ------                             --------------  -----  
 0   gender                             4000 non-null   int64  
 1   Near_Location                      4000 non-null   int64  
 2   Partner                            4000 non-null   int64  
 3   Promo_friends                      4000 non-null   int64  
 4   Phone                              4000 non-null   int64  
 5   Contract_period                    4000 non-null   int64  
 6   Group_visits                       4000 non-null   int64  
 7   Age                                4000 non-null   int64  
 8   Avg_additional_charges_total       4000 non-null   float64
 9   Month_to_end_contract              4000 non-null   float64
 10  Lifetime                           4000 non-null   int64  
 11  Avg_class_frequency_total          4000 non-null   float64
 12  Avg_class_frequency_current_month  4000 non-null   float64
 13  Churn                              4000 non-null   int64  
dtypes: float64(4), int64(10)
memory usage: 437.6 KB
Out[2]:
gender Near_Location Partner Promo_friends Phone Contract_period Group_visits Age Avg_additional_charges_total Month_to_end_contract Lifetime Avg_class_frequency_total Avg_class_frequency_current_month Churn
count 4000.000000 4000.000000 4000.000000 4000.000000 4000.000000 4000.000000 4000.000000 4000.000000 4000.000000 4000.000000 4000.000000 4000.000000 4000.000000 4000.000000
mean 0.510250 0.845250 0.486750 0.308500 0.903500 4.681250 0.412250 29.184250 146.943728 4.322750 3.724750 1.879020 1.767052 0.265250
std 0.499957 0.361711 0.499887 0.461932 0.295313 4.549706 0.492301 3.258367 96.355602 4.191297 3.749267 0.972245 1.052906 0.441521
min 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 18.000000 0.148205 1.000000 0.000000 0.000000 0.000000 0.000000
25% 0.000000 1.000000 0.000000 0.000000 1.000000 1.000000 0.000000 27.000000 68.868830 1.000000 1.000000 1.180875 0.963003 0.000000
50% 1.000000 1.000000 0.000000 0.000000 1.000000 1.000000 0.000000 29.000000 136.220159 1.000000 3.000000 1.832768 1.719574 0.000000
75% 1.000000 1.000000 1.000000 1.000000 1.000000 6.000000 1.000000 31.000000 210.949625 6.000000 5.000000 2.536078 2.510336 1.000000
max 1.000000 1.000000 1.000000 1.000000 1.000000 12.000000 1.000000 41.000000 552.590740 12.000000 31.000000 6.023668 6.146783 1.000000

По этим данным можно сделать выводы:

  • примерно поровну мужчин и женщин
  • большинство (84,5%) проживаниет или работает в районе, где находится фитнес-центр
  • почти половина сотрудник компании-партнёра клуба
  • контактный номер телефона есть почти у всех (90,3%)
  • 40% клиентов посещает групповые занятия
  • средний отток составляет 26,5%
  • возраст варьируется от 18 до 41
  • средний возраст 29
  • средняя частота посещений в неделю - меньше двух
В [3]:
Количество дубликатов в данных: 0
gender near_location partner promo_friends phone contract_period group_visits age avg_additional_charges_total month_to_end_contract lifetime avg_class_frequency_total avg_class_frequency_current_month churn
0 1 1 1 1 0 6 1 29 14.227470 5.0 3 0.020398 0.000000 0
1 0 1 0 0 1 12 1 31 113.202938 12.0 7 1.922936 1.910244 0
2 0 1 1 0 1 1 0 28 129.448479 1.0 2 1.859098 1.736502 0
3 0 1 1 1 1 12 1 33 62.669863 12.0 2 3.205633 3.357215 0
4 1 1 1 1 1 1 0 26 198.362265 1.0 3 1.113884 1.120078 0
Out[3]:
gender near_location partner promo_friends phone contract_period group_visits age avg_additional_charges_total month_to_end_contract lifetime avg_class_frequency_total avg_class_frequency_current_month churn
3995 1 1 1 0 1 12 0 33 2.406023 12.0 8 2.284497 2.349070 0
3996 0 1 0 0 1 1 1 29 68.883764 1.0 1 1.277168 0.292859 1
3997 1 1 1 1 1 12 0 28 78.250542 11.0 2 2.786146 2.831439 0
3998 0 1 1 1 1 6 0 32 61.912657 5.0 3 1.630108 1.596237 0
3999 1 0 1 0 0 12 1 30 178.861814 12.0 1 1.101832 1.035270 0
В [4]:
gender :
[1 0]
near_location :
[1 0]
partner :
[1 0]
promo_friends :
[1 0]
phone :
[0 1]
contract_period :
[ 6 12  1]
group_visits :
[1 0]
age :
[29 31 28 33 26 34 32 30 23 27 35 25 36 24 21 37 22 19 20 38 39 18 41]
avg_additional_charges_total :
[ 14.22747042 113.20293765 129.44847933 ...  78.25054157  61.91265691
 178.86181361]
month_to_end_contract :
[ 5. 12.  1.  6.  3. 10. 11.  9.  4.  7.  8.  2.]
lifetime :
[ 3  7  2  0  1 11  4  8 14  6  5 15 12 21 10 20  9 13 17 16 24 22 31 26
 23 18 19 27 29]
avg_class_frequency_total :
[0.02039795 1.92293606 1.85909835 ... 2.78614636 1.63010814 1.10183221]
avg_class_frequency_current_month :
[0.         1.91024352 1.73650189 ... 2.8314395  1.59623664 1.03526976]
churn :
[0 1]

C данными проблем нет.

Нет дулбикатов, нет пропусков, корректный возраст от 18 до 41, нет отрицательных значений. Приступаем к следующему шагу

В начало

Шаг 2. Провести исследовательский анализ данных (EDA)

В [5]:
Out[5]:
gender near_location partner promo_friends phone contract_period group_visits age avg_additional_charges_total month_to_end_contract lifetime avg_class_frequency_total avg_class_frequency_current_month
churn
0 0.510037 0.873086 0.534195 0.353522 0.903709 5.747193 0.464103 29.976523 158.445715 5.283089 4.711807 2.024876 2.027882
1 0.510839 0.768143 0.355325 0.183789 0.902922 1.728558 0.268615 26.989632 115.082899 1.662582 0.990575 1.474995 1.044546

Из усреднённых данных видно, что различия есть в признаках. У тех кто ушел в отток признаки меньше.

В [6]:

Из графиков видно:

  • У обоих полов уходят примерно одинаковое количество людей
  • доля клиентов не проживающих или работающих в районе, где находится фитнес-центр намного меньше.
  • сотрудников компании-партнёра клуба больше и уходили они реже.
  • людей которые использовала промо-код от знакомого при оплате первого абонемента меньше и отток у них на много реже(вместе заниматься всегда веселее)
  • мало клиентов которые не указывали контактный телефон.
  • чаще всего клиенты уходили когда длительность абонемента была 1 мес.
  • те кто посещал групповые визиты уходили реже.
  • пик ухода по возрасту примерно 27 лет. Клиенты возрастом до 25 лет уходят чаще чем остаются. Больше всего клиентов возрастом 30 лет.
  • средняя частота посещений в неделю за предыдущий месяц больше всего 0, почти не ходят 3 и более раз.
В [7]:

Матрица корреляций подтверждает картину на графиках. Больше всего на отток пользователей влияет:

  • время с момента первого обращения в фитнес-центр
  • средняя частота посещений в неделю за предыдущий месяц
  • возраст
  • срок до окончания текущего действующего абонемента

Проживание или работа в районе, где находится фитнес-центр положительно коррелирует с акцией «приведи друга» . Так же положительно коррелируют если клиент сотрудник компании-партнёра клуба с акцией «приведи друга» или с длительностью текущего действующего абонемента

Шаг 3. Построить модель прогнозирования оттока пользователей

В [8]:

Обучим модель на train-выборке двумя способами.

Логистической регрессией и случайным лесом. Для этого сделаю цикл и оцениню метрики accuracy, precision и recall для обеих моделей на валидационной выборке

В [9]:
Accuracy: 0.92
Precision: 0.87
Recall: 0.80
 
Accuracy: 0.92
Precision: 0.88
Recall: 0.83
 

Метрика Accuracy Это доля верно угаданных ответов из всех прогнозов

Precision (Точность) и Recall (полнота) чтобы оценить модель без привязки к соотношению классов. precision говорит, какая доля прогнозов относительно "1" класса верна. recall показывает, сколько реальных объектов "1" класса вы смогли обнаружить с помощью модели.

Хоть и точность у обоих моделей одинаковая но полнота у логистической регрессии лучше.

Логистической регрессией показала себя лучше чем случайный лес.

В начало

Шаг 4. Сделать кластеризацию пользователей

В [10]:
Out[10]:
array([[ 0.97970588,  0.42788074,  1.02686062, ..., -0.19332863,
        -1.91191971, -1.67847198],
       [-1.0207145 ,  0.42788074, -0.973842  , ...,  0.87368001,
         0.04517569,  0.1360137 ],
       [-1.0207145 ,  0.42788074,  1.02686062, ..., -0.46008079,
        -0.02049263, -0.02901851],
       ...,
       [ 0.97970588,  0.42788074,  1.02686062, ..., -0.46008079,
         0.93313947,  1.01103141],
       [-1.0207145 ,  0.42788074,  1.02686062, ..., -0.19332863,
        -0.25604937, -0.16225246],
       [ 0.97970588, -2.33709981,  1.02686062, ..., -0.72683295,
        -0.79947418, -0.69509885]])
В [11]:

На основании полученного, можно выделить 4 кластера клиентов. Для более детального рассмотрения можно выделить 6 кластеров клиента(т.к. фиолетовый можно разделить на 3 больших кластера)

В [12]:
Out[12]:
gender near_location partner promo_friends phone contract_period group_visits age avg_additional_charges_total month_to_end_contract lifetime avg_class_frequency_total avg_class_frequency_current_month churn cluster
0 1 1 1 1 0 6 1 29 14.227470 5.0 3 0.020398 0.000000 0 0
1 0 1 0 0 1 12 1 31 113.202938 12.0 7 1.922936 1.910244 0 4
2 0 1 1 0 1 1 0 28 129.448479 1.0 2 1.859098 1.736502 0 3
3 0 1 1 1 1 12 1 33 62.669863 12.0 2 3.205633 3.357215 0 4
4 1 1 1 1 1 1 0 26 198.362265 1.0 3 1.113884 1.120078 0 3
В [13]:
Out[13]:
gender near_location partner promo_friends phone contract_period group_visits age avg_additional_charges_total month_to_end_contract lifetime avg_class_frequency_total avg_class_frequency_current_month churn
cluster
0 0.522078 0.862338 0.470130 0.306494 0.000000 4.787013 0.425974 29.301299 143.957664 4.475325 3.924675 1.847220 1.716369 0.267532
1 0.480787 0.812559 0.000000 0.086223 1.000000 1.866917 0.325211 28.145267 131.369042 1.791003 2.345829 1.325865 1.086883 0.550141
2 0.559567 0.858002 0.338147 0.197353 0.998797 2.730445 0.448857 30.196149 164.579011 2.519856 5.010830 2.928140 2.934140 0.048135
3 0.509603 0.750320 1.000000 0.451985 1.000000 2.554417 0.303457 28.499360 129.812508 2.370038 2.832266 1.355379 1.176172 0.395647
4 0.495726 0.943376 0.752137 0.541667 1.000000 11.352564 0.564103 29.993590 164.563799 10.376068 4.817308 2.028169 2.020129 0.023504

Кластеры почти не отличаются по среднему возрасту и полу.

Кластер 0:

  • клиенты с самой большой длительностью контракта
  • с высокой вероятностью пользующиеся партнерской программой или приглашениями друзей
  • большие траты на дополнительные услуги фитнес-центра
  • cамая большая вероятность посещения групповых занятий
  • живут или работают возле фитнес-центра
  • самый большой срок до окончания текущего действующего абонемента (в месяцах)
  • отток 2%
  • средняя частота посещений в неделю за предыдущий месяц 2 раза

Кластер 1:

  • меньший срок контракта и меньшее количество посещений групповых занятий, чем в кластере 0
  • для них характерна меньшая частота посещений (менее 2), которая падает за последний месяц;
  • нет наличия контактного телефона
  • отток 26%

Кластеры 2 и 3:

  • клиенты с самой большой вероятностью оттока
  • самая низкая продолжительность контракта;
  • самое низкое среднее количество посещений групповых занятий
  • самая значительная разница между посещением в среднем и посещением за последний месяц - второе значительно ниже
  • для кластера 3 характерен самый низкий среди всех кластеров средний возраст
  • показатели акции «приведи друга» для кластера 2 самые низкие в датасете;
  • в кластер 2 попали только те, кто не живет/работает возле фитнес-центра.

Кластер 4:

  • самые большие траты на дополнительные услуги фитнес-центра
  • самая высокая посещаемость, которая не падает за последний месяц
  • самый высокий среди всех кластеров средний возраст
  • большая вероятность посещения групповых занятий
В [14]:
Out[14]:
0 1 2 3 4 5 6 7 8 9
gender 1.000000 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 0.000000
near_location 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
partner 1.000000 0.000000 1.000000 1.000000 1.000000 0.000000 1.000000 0.000000 1.000000 0.000000
promo_friends 1.000000 0.000000 0.000000 1.000000 1.000000 0.000000 1.000000 0.000000 1.000000 0.000000
phone 0.000000 1.000000 1.000000 1.000000 1.000000 1.000000 0.000000 1.000000 1.000000 1.000000
contract_period 6.000000 12.000000 1.000000 12.000000 1.000000 1.000000 6.000000 1.000000 1.000000 1.000000
group_visits 1.000000 1.000000 0.000000 1.000000 0.000000 1.000000 1.000000 0.000000 1.000000 0.000000
age 29.000000 31.000000 28.000000 33.000000 26.000000 34.000000 32.000000 30.000000 23.000000 31.000000
avg_additional_charges_total 14.227470 113.202938 129.448479 62.669863 198.362265 450.743960 94.266389 217.786641 45.409909 65.310836
month_to_end_contract 5.000000 12.000000 1.000000 12.000000 1.000000 1.000000 6.000000 1.000000 1.000000 1.000000
lifetime 3.000000 7.000000 2.000000 2.000000 3.000000 3.000000 2.000000 0.000000 1.000000 11.000000
avg_class_frequency_total 0.020398 1.922936 1.859098 3.205633 1.113884 2.623477 1.138941 1.213502 1.106239 1.810852
avg_class_frequency_current_month 0.000000 1.910244 1.736502 3.357215 1.120078 2.637007 1.277242 1.049387 1.059333 1.951368
churn 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000
cluster 0.000000 4.000000 3.000000 4.000000 3.000000 2.000000 0.000000 1.000000 3.000000 2.000000
В [15]:
В [16]:
012340123456
churn01avg_class_frequency_current_monthclusteravg_class_frequency_current_month
012340123456
churn01avg_class_frequency_totalclusteravg_class_frequency_total
012340100200300400500
churn01avg_additional_charges_totalclusteravg_additional_charges_total

Средняя частота посещений в неделю за все время с начала действия абонемента у 3 кластера в оттоке выше чем у тех кто остался. В остальном у тех кто остались показатели выше. только в 2-х кластерах есть 18 летние и они в оттоке. Средний возраст 30 лет, как и писал выше.

В [17]:
Out[17]:
cluster total churn percent_churn
0 0 385 103 26.75
1 1 1067 587 55.01
2 2 831 40 4.81
3 3 781 309 39.56
4 4 936 22 2.35

Самые надежные кластеры это 0 и 4 . У 0 ушло 2.77% а у 4 6.81%. Склонные к оттоку кластеры это 2(44.36%) и 3(51.43%)

В начало

Шаг 5. Сформулировать выводы и сделать базовые рекомендации по работе с клиентами

Качество данных

Хорошо бы иметь больше данных для построения более качественной модели клиента. Т.к не известно за какой период собраны эти данные, может они уже не актуальны. В какой валюте тратят клиенты деньги, на что именно. По этим параметрам можно составить и доработать модель клиента. Какие групповые занятия посещают и т.к

Общие характеристики клиентов, которые склонны к оттоку

Самые важные причины, влияющие на отток пользователей, следующие:

  • меньший возраст
  • отсутствие проживания или работы в районе, где находится фитнес-центр
  • маленькая продолжительность контракта,
  • низкий уровень партнерских программ и акции "приведи друга"
  • низкий факт посещения групповых занятий

Рекомендации

Для группы пользователей кластера 0 и 4 лучше ничего не делать, пока показатели не изменяться. Зачем влезать туда что и так хорошо работает

1 кластеру можно предложить новые групповые занятия или скидку,бесплатную услугу от фитнес-центра: кафе, спорт-товары, косметический и массажный салон т.к их показатели высоки и им чего-то не хватает. Здесь надо провести более детальный анализ. Но этим людям не надо быть навязчивыми это может их отпугнуть т.к они не оставляли свой номер телефона. Это может говорить о том что лишний спам им не нужен.

2 кластер. Это люди которые не проживанию или работают в районе, где находится фитнес-центр. Так же у них низкий показатель акции «приведи друга» и факт посещения групповых занятий. Возможно, им скучно заниматься одним или они находят фитнес-центр поближе к дому или работе. Можно попробовать предложить им побольше групповых занятий, там они могут познакомиться с людьми и вместе ходить в зал и тогда расстояние покажется незначительной проблемой.

3 кластер. Это самая большая группа людей и так же они самая молодая группа. Они посещают реже всех фитнес-центр, может дело в работе, нехватает мотивации или дело в сезоне. Ведь неизвестно когда они уходили. Им можно предложить скидку на абонемент для дополнительной мотивации или сделать упор на другие услуги фитнес-центра, вроде массажа, сауны, бассейна чтобы они могли расслабиться после работы.